function Animal(type, food) {
  // this就是正在构建的animal实例
  this.type = type;
  this.food = food;
}

/* 
所有动物的eat方法都一模一样 
为了避免所有动物实例人手一份冗余的eat方法 统一将eat方法挂载在类的原型对象上
所有实例访问的时候 通过引用原型对象中的eat地址去调用eat
从而达到共享和节约内存的目的
*/
Animal.prototype.eat = function () {
  console.log(`一只${this.type}正在摄入${this.food}`);
};

function Person(name, age) {
  // this.type = "人类";
  // this.food = "大米白面肉类";
  // 调用父类构造方法，为当前正在构建的实例（张三丰）绑定物种和食物
  Animal.call(this, "人类", "瓜果菜蔬大米白面肉类");

  this.name = name;
  this.age = age;
}

/* 继承父类方法：以一个父类实例做子类原型对象 */
const xinniangzi = new Animal("人", "瓜果菜蔬大米白面肉类");
Person.prototype = xinniangzi;

/* 对父类的eat方法进行一些扩展 */
Person.prototype.eat = function () {
  // 调用父类eat方法,主语绑定当前子类实例
  Animal.prototype.eat.call(this);

  // 子类做新的扩展
  console.log(`以人类的方式进食：${this.name}正在用膳`);
};

/* 原型方法为所有实例所共享 */
Person.prototype.think = function () {
  console.log(`${this.name}正在思考`);
};

function Student(name, age, major) {
  //   this.name = name;
  //   this.age = age;
  Person.call(this, name, age);

  // 学生有自己的专业
  this.major = major;
}

/* 继承父类方法：父类实例做子类原型 */
Student.prototype = new Person(null, null);

/* 重写父类的思考方法 */
Student.prototype.think = function () {
  // Person.prototype.think.call(this);
  console.log(`${this.name}正在思考${this.major}`);
};
